package com.msb.sentinel.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/****************************************************
 * Sentinel 热点规则练习
 *
 * @author lbf
 * @date 2025/6/25 9:56
 ****************************************************/
@RestController
public class HostRulesController {


    /**
     * 使用 @RequestParam 指定参数名称，required = false 表示不是必输项
     */
    @GetMapping("/testHotKey")
    /**
     * 使用注解 @SentinelResource 指定Sentinel 操作的资源
     *
     * 注解 @SentinelResource 标注的方法被认为是接口资源
     * @SentinelResource 标注的资源被限流后，会直接返回500异常，不友好；可以通过注解 @SentinelResource
     * 的参数 blockHandler 来处理500异常；blockHandler 的值是处理该 BlockException 异常的方法名称，如 parseTestHostKeyEx，
     * 该方法的返回值要与 @SentinelResource 标注的方法的返回值一致，且要包含 @SentinelResource方法的参数列表
     */
    @SentinelResource(value = "testHotKey",blockHandler = "parseTestHostKeyEx")
    public String testHostKey(@RequestParam(value = "hot1",required = false) String hot1,
                              @RequestParam(value = "hot2",required = false) String hot2,
                              @RequestParam(value = "hot3",required = false) String hot3){

        return "+++++++++++++++++++ testHostKey";
    }

    /**
     * 处理 @SentinelResource  标注方法的异常，
     * 该方法的返回值要与 @SentinelResource 标注的方法的返回值一致，且要包含 @SentinelResource方法的参数列表
     *  todo：这个方法的作用域也需要与 @SentinelResource 标注的方法的作用域一致
     */
    public String parseTestHostKeyEx(String hot1, String hot2, String hot3, BlockException e){
        return "系统繁忙，请稍后重试！";
    }
}
